package com.xiaojiang.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaojiang.dto.UpdateUserPwdDto;
import com.xiaojiang.dto.UserLoginDto;
import com.xiaojiang.dto.UserQueryAllDto;
import com.xiaojiang.entity.UserAll;
import com.xiaojiang.mapper.UserMapper;
import com.xiaojiang.service.UserService;
import com.xiaojiang.vo.UserQueryAllVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 功能：
 * 作者：小江
 * 日期：2024年10月22日
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public SaResult registerUser(UserAll userAll) {
        if (userAll.getUserAccount() == null || userAll.getUserPwd() == null) {
            return SaResult.error("账号或密码为空!");
        }
        // 检查账号是否已存在
        UserAll existingUser = userMapper.selectByUserAccount(userAll.getUserAccount());
        if (existingUser != null) {
            return SaResult.error("该账号已被注册!");
        }
        userMapper.insert(userAll);
        return SaResult.ok();
    }

    @Override
    public SaResult loginUser(UserLoginDto userLoginDto) {
        // 通过页面传输的账号从数据库中查询信息
        QueryWrapper<UserAll> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_account", userLoginDto.getUserAccount());
        UserAll userOne = userMapper.selectOne(queryWrapper);
        if(userOne.getIsDelete() == 1){
            return SaResult.error("该账号已被回收!");
        }
        if (ObjectUtils.isEmpty(userOne)) {
            return SaResult.error("账号不存在!");
        } else {
            if (userOne.getUserPwd().equals(userLoginDto.getUserPwd())) {
                // 登录并获取token
                StpUtil.login(userOne.getUserAccount());
                String token = StpUtil.getTokenValue();
                // 构建返回结果，包括token
                Map<String, Object> resultData = new HashMap<>();
                resultData.put("userAccount", userOne.getUserAccount());
                resultData.put("satoken", token);
                resultData.put("message", "登录成功!");
                return SaResult.ok().setMap(resultData);
            } else {
                return SaResult.error("密码错误!");
            }
        }
    }

    @Override
    public SaResult deleteUserById(Integer userId) {
        if (userId == null) {
            return SaResult.error("删除失败！");
        }
        UserAll user = userMapper.selectById(userId);
        if (user == null) {
            return SaResult.error("用户不存在！");
        }
        // 检查用户是否已经被标记为已删除
        if (user.getIsDelete().equals(1)) {
            return SaResult.error("该用户已经删除！");
        }
        // 将用户标记为已删除
        user.setIsDelete(1);
        // 更新用户信息
        int updateResult = userMapper.updateById(user);
        if (updateResult > 0) {
            return SaResult.ok("删除成功！");
        } else {
            return SaResult.error("删除失败！");
        }
    }

    @Override
    public SaResult queryUserAll(UserQueryAllDto userQueryAllDto) {
        List<UserQueryAllVo> userQueryAllVos =userMapper.queryAllExistenceUser(userQueryAllDto);
        Long total = userMapper.countAllExistenceUser(userQueryAllDto);
        if (userQueryAllVos == null || total == 0){
            return SaResult.error("查询失败！");
        }
        Map<String,Object> map = new HashMap<>();
        map.put("total",total);
        map.put("userQueryAllVos",userQueryAllVos);
        return SaResult.ok("查询成功！").setData(map);
    }

    @Override
    public SaResult updateUserPwd(UpdateUserPwdDto updateUserPwdDto) {
        UserAll user = userMapper.selectById(updateUserPwdDto.getUserId());
        // 检查旧密码是否为 null
        String oldPwd = updateUserPwdDto.getOldPwd();
        if (oldPwd == null) {
            return SaResult.error("请输入旧密码!");
        }
        // 检查新密码和确认密码是否一致
        if (oldPwd.equals(updateUserPwdDto.getNewPwd()) || !updateUserPwdDto.getNewPwd().equals(updateUserPwdDto.getRePwd())) {
            return SaResult.error("新密码不能与旧密码相同，且两次输入的新密码必须一致!");
        }
        // 检查用户是否存在且旧密码是否正确
        if (user != null && user.getUserPwd().equals(oldPwd)) {
            user.setUserPwd(updateUserPwdDto.getRePwd());
            int i = userMapper.updateById(user);
            if (i > 0) {
                return SaResult.ok("密码修改成功");
            } else {
                return SaResult.error("密码修改失败");
            }
        } else {
            return SaResult.error("用户不存在或旧密码错误");
        }
    }


}
